Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
题目来源:LeetCode>合并两个排序的链表
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例1:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
限制:
0 <= 链表长度 <= 1000
二、思路分析:
思路一:
- 这一题是比较简单的一题,可以使用迭代思想求解,我们至于要在while循环中遍历两个链表,比较它们的大小,然后插入到新的链表中即可
- 返回的 result.next 因为在初始化的时候,我们的头节点是0 ,这里我们在返回的时候把头掐掉即可
- 每次循环记得previousNode也要后移一位
- 如果循环结束后还有链表非空,previousNode指向非空链表
思路二:
- 递归求解
- 如果有一个链表为空,返回另一个链表
- 如果l1节点值比l2小,下一个节点应该是l1,应该returnl1
- 在return之前,指定l1的下一个节点应该是l1.next和l2俩链表的合并后的头结点
- 如果l1节点值比l2大,下一个节点应该是l2,应该return l2
- 在return之前,指定l2的下一个节点应该是l1和l2.next俩链表的合并后的头结点
思路三:
- 双指针法
三、AC 代码:
思路一:
class Solution {
public ListNode mergeTwoLists(ListNode node1, ListNode node2) {
ListNode result = new ListNode(0);
ListNode previousNode = result;
while (node1 != null && node2 != null) {
if (node1.val >= node2.val) {
previousNode.next = node2;
node2 = node2.next;
} else {
previousNode.next = node1;
node1 = node1.next;
}
previousNode = previousNode.next;
}
previousNode.next = node1 != null ? node1 : node2;
return result.next;
}
}
思路二:
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null || l2 == null) {
return l1 != null ? l1 : l2;
}
if (l1.val <= l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}
}
思路三:
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode newHeadNode = new ListNode(0);
ListNode currentNode = newHeadNode;
ListNode currentNode1 = l1;
ListNode currentNode2 = l2;
while (currentNode1 != null && currentNode2 != null) {
if (currentNode1.val <= currentNode2.val) {
currentNode.next = currentNode1;
currentNode = currentNode.next;
currentNode1 = currentNode1.next;
} else {
currentNode.next = currentNode2;
currentNode = currentNode.next;
currentNode2 = currentNode2.next;
}
}
if (currentNode1 == null) {
currentNode.next = currentNode2;
} else {
currentNode.next = currentNode1;
}
return newHeadNode.next;
}
}