原题地址: . - 力扣(LeetCode)
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]
迭代
链表节点结构已经定义好,而且已经做了升序排列。现在我们需要分别遍历两个链表,然后依次比较,按从小到大的顺序生成新的链表就可以了。这其实就是“归并排序”的思路。
最简单的想法,就是逐个遍历两个链表中的节点,依次比对。
我们假设原链表为list1和list2。只要它们都不为空,就取出当前它们各自的头节点就行比较。值较小的那个结点选取出来,加入到结果链表中,并将对应原链表的头(head)指向下一个结点;而值较大的那个结点则保留,接下来继续做比对。
另外,为了让代码更加简洁,我们可以引入一个哨兵节点(sentinel),它的next指向结果链表的头结点,它的值设定为-1。
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
// 定义哨兵节点,它的next就是结果,这样的好处是不用判空初始节点
ListNode resultPrev = new ListNode(-1);
ListNode prev = resultPrev;
while (list1 != null && list2 != null) {
if (list1.val <= list2.val) {
prev.next = list1;
prev = prev.next;
list1 = list1.next;
} else {
prev.next = list2;
prev = prev.next;
list2 = list2.next;
}
}
prev.next = (list1 == null) ? list2 : list1;
return resultPrev.next;
}