一、题目描述:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4] 示例 2:
输入:l1 = [], l2 = [] 输出:[] 示例 3:
输入:l1 = [], l2 = [0] 输出:[0]
提示:
两个链表的节点数目范围是 [0, 50] -100 <= Node.val <= 100 l1 和 l2 均按 非递减顺序 排列
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/me…
二、思路分析:
根据以上规律考虑本题目:
我们判断 l1 和 l2 头结点哪个更小,然后较小结点的 next 指针指向其余结点的合并结果。
当两个链表都为空时,表示我们对链表已合并完成。 思路:
如果list1已经为NULL了就返回list2;相反如果List2==NULL,return list1,当然如果两个都为NULL,循环就会结束。
当list1和list2都不为空时,在第一次递归之前判断头节点的大小,如果list1>=list2则把list2当头节点, 把list1和list2->next放入递归。相反情况也是,进入递归。
由上述可得,我们最后返回的链表头节点肯定是小的那一个,所以在最后的return时返回小的结点就可以实现。
三、AC 代码:
class Solution { public ListNode mergeTwoLists(ListNode list1, ListNode list2) { ListNode dummyNode = new ListNode(0); ListNode cur = dummyNode; while(list1!=null && list2!=null) { if(list1.val < list2.val) { cur.next = new ListNode(list1.val); list1 = list1.next; }else { cur.next = new ListNode(list2.val); list2 = list2.next; } cur = cur.next; } while(list1!=null) { cur.next = new ListNode(list1.val); list1 = list1.next; cur = cur.next; } while(list2!=null) { cur.next = new ListNode(list2.val); list2 = list2.next; cur = cur.next; } return dummyNode.next; } }
四、总结:
写题解不易,若对你有帮助,点赞评论再走吧。ヽ(✿゚▽゚)ノ,如有不足,请大家斧正。