import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param pHead1 ListNode类 * @param pHead2 ListNode类 * @return ListNode类 */ public ListNode Merge (ListNode pHead1, ListNode pHead2) { // write code here //处理链表为空的情况 if (pHead1 == null) return pHead2; if (pHead2 == null) return pHead1; ListNode sourceNode, destNode; //初始节点值小的,为目标链表,大的为需要插入到目标链表的链表 if (pHead1.val > pHead2.val) { sourceNode = pHead1; destNode = pHead2; } else { sourceNode = pHead2; destNode = pHead1; } //System.out.println(sourceNode.val); ListNode current = destNode; ListNode next = current.next; boolean isMerging = true; while (isMerging){ while (current != null) { if (next == null){ current.next = sourceNode; isMerging = false; break; } if (next.val < sourceNode.val){ current = next; next = next.next; } else { ListNode tmp = sourceNode; sourceNode = sourceNode.next; current.next = tmp; tmp.next = next; current = tmp; break; } } //System.out.println(sourceNode.val); if(sourceNode == null) isMerging = false; } return destNode; } }
将两个链表分为目的链表和源链表,将源链表插入目的链表
需要处理链表为空的情况
循环体需要注意终止条件,这里使用了一个isMerging变量来控制循环
使用current和next来判断每个位置是否满足插入条件,当满足插入条件时,插入完成后,current应该后移一位(即挪到新插入的节点),而next不需要移动。
需要注意,使用临时节点tmp前,需要先将sourceNode 挪到下一个节点。不然改变tmp的指向也会改变sourceNode的指向