1 解题思路
- 声明两个指针ptr和mark,mark用于标记其中一个链表的位置,ptr用于游走在另一个链表和mark上的ListNode进行比较。
- 将ptr定义为表头value值较小的链表,mark定义为另一个链表的表头。
- ptr开始向后游走,若遇到比mark小的value,ptr继续向后游走,否则将mark所在的ListNode嵌入ptr所在的链表中,mark则向后移动一位。
如图所示:
2 Java代码实现
注:实际代码操作与上图有所出入,图片中的ptr在代码里是ptr.next
public class Solution { ListNode ptr; ListNode mark; ListNode newListNode; public ListNode mergeTwoLists (ListNode l1, ListNode l2) { if (l1 == null) return l2; else if (l2 == null) return l1; // write code here ptr = l1.val < l2.val ? l1 : l2; mark = l1.val >= l2.val ? l1 : l2; newListNode = ptr; // 比较两个链表,链表1当前节点的下一个节点数值比链表2的大,则链表2的当前节点变为链表1的下一个节点 // 且链表2被抽取的节点的下一个节点变为链表1的下下个节点 while (ptr.next != null) { // 如果被取的一方已空,直接返回 if (mark == null) return newListNode; if (ptr.next.val > mark.val) { ListNode temp = mark.next; mark.next = ptr.next; ptr.next = mark; mark = temp; } ptr = ptr.next; } ptr.next = mark; return newListNode; } }