链表题(2021-6-29)

本文详细介绍了几种常见的链表操作算法,包括合并两个已排序的链表、复制复杂链表及寻找两个链表的第一个公共节点。通过具体的代码实现,帮助读者理解这些算法的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.合并两个排序的链表

public class Solution{
  public ListNode Merge(ListNode list1,ListNode list2){
  ListNode preHead=new ListNode(-1);//创建一个头节点,归一化操作,否则第一个加入的节点还要单独做
  ListNode pre=preHead;//两个指针一个指向头节点,一个指向尾节点
  while(list1!=null&&list2!=null){//当list1和list2都不为空
     if(list1.val<list2.val){//如果链表1的值小于链表2的值
        pre.next=list1;//pre连接值小的指针
        list1=list1.next;//链表头节点后移
     }else{
        pre.next=list2;//pre连接值小的指针
        list2=list2.next;//链表的头节点后移
     }
     pre=pre.next;//重新指向尾节点
  }
  pre.next=list1==null?list2:list1;//如果list1为空,那么链表的头节点就是list2的节点
  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 78 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;
}
}
思路:使用双指针
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值