算法进修Day-11
21. 合并两个有序链表
难度:简单
题目要求:
将两个升序链表合并为一个新的升序链表并返回,新链表是通过拼接给定的两个链表的所有节点组成的
示例1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例2:
输入:l1 = [], l2 = []
输出:[]
示例3:
输入:l1 = [], l2 = [0]
输出:[0]
题解:
最开始的想法:直接使用递归方法,如果第一个
list1的值小于list2,就将list1作为主链,然后将list1变为list1.next加入递归,返回list1,否则,与上述操作相反,返回list2
想法代码
public static ListNode MergeTwoLists(ListNode list1, ListNode list2)
{
if (list1 == null)
{
return list2;
}
else if (list2 == null)
{
return list1;
}
else if (list1.val <= list2.val)
{
list1.next = MergeTwoLists(list1.next, list2);
return list1;
}
else
{
list2.next = MergeTwoLists(list1, list2.next);
return list2;
}
}
括号生成
难度:中等
题目要求:
数字n代表生成括号的对数,设计一个函数,用于能够生成所有可能并且有效的括号组合
示例1:
输入:n = 3
输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]
示例2:
输入:n = 1
输出:[“()”]
题解:
最开始的想法:用回溯法来实现这个函数,如果左边小于
n,那么left加一并给字符串加上‘(',如果右边小于n,则相反,如果右大于左,直接返回,如果左右都等于n,则可以将字符串加入到结果中
想法代码
public static IList<string> GenerateParenthesis(int n)
{
IList<string> result = new List<string>();
ReTrack(n, result, 0, 0, "");
return result;
}
public static void ReTrack(int n,IList<string> result,int right,int left,string s)
{
if (right > left)
{
return;
}
if (left == n && right == n)
{
result.Add(s);
return;
}
if (left < n)
{
ReTrack(n,result,right,left + 1,s + '(');
}
if (right < n)
{
ReTrack(n, result,right + 1, left,s + ")");
}
}
博客记录算法进修Day-11的内容,包含两道算法题。一是合并两个有序链表,要求将两个升序链表合并为新的升序链表,题解考虑用递归方法;二是括号生成,需生成指定对数的所有有效括号组合,题解打算用回溯法实现。

6776

被折叠的 条评论
为什么被折叠?



