1.合并两个排序的链表
public class Solution{
public ListNode Merge(ListNode list1,ListNode list2){
ListNode preHead=new ListNode(-1);
ListNode pre=preHead;
while(list1!=null&&list2!=null){
if(list1.val<list2.val){
pre.next=list1;
list1=list1.next;
}else{
pre.next=list2;
list2=list2.next;
}
pre=pre.next;
}
pre.next=list1==null?list2:list1;
return preHead.next;
}
}
思路:1.创建一个头节点,归一化操作。
2.两个指针,一个指向头节点,一个指向尾节点
3.当list1和list2都不为空,如果链表1的值小于链表2的值,pre连接值小的指针,链表头节点后移。
4.如果链表2的值小于链表1的值,pre连接值小的指针,链表头节点后移。
5.如果list1为空,那么链表就是list2的节点
2.复杂链表的复制
public class Solution{
public RandomListNode Clone(RandomListNode pHead){
if(pHead==null) return null;
RandomListNode head=new RandomListNode(pHead.label);
RandomListNode temp=head;
while(pHead.next!=null){
temp.next=new RandomListNode(pHead.next.label);
if(pHead.random!=null){
temp.random=new RandomListNode(pHead.random.label);
}
pHead=pHead.next;
temp=temp.next;
}
return head;
}
}
思路:1.复制结点 7 8 9 复制后 7 7’ 8 8' 9 9'
2.复制random指针 7 random 9
7' random 9 next 9'
3.分离出来 7' 8' 9' 10'
3.两个链表的第一个公共结点
public class Solution{
public ListNode FindFirstCommonNode(ListNode pHead1,ListNode pHead2){
ListNode p1=pHead1;
ListNode p2=pHead2;
while(p1!=p2){
p1=(p1!=null?p1.next:pHead2);
p2=(p2!=null?p2.next:pHead1);
}
return p1;
}
}
思路:使用双指针