LeetCode 21合并两个有序链表&22括号生成

微信搜索bigsai,回复进群,加入打卡。维护不易,欢迎点赞支持!

在这里插入图片描述

合并两个有序列表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

分析:
思路,这题思路比较简单,合并两个有序链表,可以创建一个新的链表,然后两个子链表进行遍历比较插入当前较小的那个。

具体代码为:

 public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
      ListNode value=new ListNode(Integer.MIN_VALUE);
      ListNode team=value;
      while (l1!=null||l2!=null) {
		if(l1==null)
		{
			team.next=l2;break;
		}
		else if (l2==null) {
			team.next=l1;break;
		}
		else {
			if(l1.val<l2.val)
			{
				team.next=new ListNode(l1.val);
				team=team.next;
				l1=l1.next;
			}
			else {
				team.next=new ListNode(l2.val);
				team=team.next;
				l2=l2.next;
			}
		  }
	   }
       return value.next;
  }

在这里插入图片描述

当然,也可以将其中一个链表L1设为定的,然后另一个L2插入进来合并。具体实现是每次向下一步,如果需要插入则把另一个链表整个都插入进来,相当于交换L1,L2节点位置。
在这里插入图片描述
具体实现为:

public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
	  if(l1==null)return l2;
	  if(l2==null)return l1;
	  if(l1.val>l2.val)//l1更小
	  {
		  ListNode team=l1;
		  l1=l2;
		  l2=team;
	  }
      ListNode value=l1;
      while (l2!=null) {
		if(l1.next==null)
		{
			l1.next=l2;break;
		}
		else if (l1.next.val<l2.val) {
			l1=l1.next;
		}
		else {
			ListNode node=l1.next;
			l1=l1.next=l2;
			l2=node;
			//l1=l1.next;
			
		}
	   }
       return value; 
  }

在这里插入图片描述

括号生成

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例:

输入:n = 3
输出:[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]

分析
这一题刚拿到手可能没啥思路解决,不知道采用什么数学方法,但是你要看到所有可能的括号组合。所有二字,摆明是搜索题,可以dfs或者bfs,这里采用dfs完成。

dfs搜索需要考虑遍历所有情况,还有就是初始和停止的条件,我们知道dfs是回溯的,如果字符串频繁创建删除效率很低,所以利用回溯回来过程将字符串还原(StringBuilder)这样可以大大提升效率。而具体需要这样思考:

  • n对括号,说明有n个(和n个),可用两个数字标记两个个数。
  • (个数不能小于)的个数,否则不满足有效括号。
  • 如果(用完,那么只能添加),如果(未用完且不满足小于)个数,那么当前既可添加(也可添加)
  • 注意作用域,参数等问题

具体实现代码为:

 List<String>list;
	public List<String> generateParenthesis(int n) {
		list=new ArrayList<String>();
		StringBuilder sBuilder=new StringBuilder();
		dfs(sBuilder,0,0,n);
		return list;	

    }
	private void dfs(StringBuilder sBuilder, int i, int j,int n) {
		if(j==n) {list.add(sBuilder.toString());return;}
		if(i<j)return;
		if(i<n)
		{
			sBuilder.append('(');
			dfs(sBuilder, i+1, j, n);
			sBuilder.deleteCharAt(i+j);
		}
		if(i>j)
		{
			sBuilder.append(')');
			dfs(sBuilder, i, j+1, n);
			sBuilder.deleteCharAt(i+j);
		}		
	}

在这里插入图片描述

这样,两题就全部结束了,如果感觉还行还请点赞支持,欢迎微信搜索bigsai回复进群一起打卡
在这里插入图片描述

Big sai CSDN认证博客专家 scikit-learn
关注微信公众号:bigsai,回复进群即可加入leetcode打卡群,回复bigsai获取珍藏pdf一份。江科大本,南理研一。平凡的日子里努力充实自己,努力学习,努力分享。期待你的关注!
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页