合并两个有序的单链表

25计算机考研,数据结构知识点整理(内容借鉴了王道408+数据结构教材),还会不断完善所整理的内容,后续的内容也会不断更新(可以关注),若有错误和不足欢迎各位朋友指出!

目录

1.算法思想

2.算法描述


删除算法中的循环条件(pre->nex!!=NULL&&k<i-1)与前插算法中的循环条件(pre!=NULL&&k<i-1)不同,因为前插时的插入位置有n+1个(n为当前单链表中数据元素的个数),i=n+1是指在第n+1个位置前插人,即在单链表的末尾插入,而删除操作中删除的合法位置只有几个,若使用与前插操作相同的循环条件,则会出现指针指空的情况,使删除操作失败。

1.算法思想

要利用现有的表LA和LB中的结点空间来建立新表LC,可通过更改结点的next域来重建新的元素之间的线性关系。为保证新表仍然递增有序,可采用尾插法建立单链表,只是新建表中的结点不用malloc,仅需从表LA和LB中选择合适的点插入新表LC即可。

2.算法描述

LinkList MergeLinkList( LinkList LA,LinkList LB)
/*将递增有序的单链表LA和LB合并成一个递增有序的单链表LC*/
{
  Node *pa,*pb;
  LinkList LC;
  /*将LC初始置空表。pa和pb分别指向两个单链表LA和LB中的第一个结点,r初值为LC且始终指向LC的表尾*/
   pa=LA->next;
   pb=LB->next ;
   LC=LA;
   LC->next=NULL;r=LC;
   /*当两个表均未处理完时,比较选择将较小值结点插入新表LC*/
   while(pa!= NULL&&pb!=NULL)
   { if( pa->data<=pb->data)
      {r->next=pa;r=pa;pa=pa->next;}
     else
      {r->next=pb;r=pb;pb= pb->next;}
   }
   if(pa)/*若表LA未完,将表LA中后续元素链到新表LC表尾*/
      r->next= pa;
   else /*否则将表LB中后续元素链到新表LC表尾*/
        r->next= pb;
     free( LB);
     return(LC);
}  /* MergeLinkList * /

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现两个有序单链表合并,可以按照以下步骤进行: 1. 创建一个新的链表头节点,并用一个变量newHead指向它。 2. 创建两个当前节点变量,分别指向两个有序链表的头节点,命名为list1和list2。 3. 使用一个循环遍历两个有序链表,直到其中一个链表为空。 4. 在循环内部,比较list1和list2当前节点的值大小。 - 如果list1的值小于等于list2的值,将list1的节点连接到新链表中,并将list1指针后移。 - 如果list2的值小于list1的值,将list2的节点连接到新链表中,并将list2指针后移。 5. 循环结束后,将剩余未遍历完的链表连接到新链表的末尾。 6. 返回新链表的头节点newHead。 以下是Java代码示例: ```java class Node { int value; Node next; public Node(int value) { this.value = value; } } public class Main { public static Node mergeLinkedLists(Node list1, Node list2) { if (list1 == null) { return list2; } if (list2 == null) { return list1; } Node newHead; if (list1.value <= list2.value) { newHead = list1; list1 = list1.next; } else { newHead = list2; list2 = list2.next; } Node current = newHead; while (list1 != null && list2 != null) { if (list1.value <= list2.value) { current.next = list1; list1 = list1.next; } else { current.next = list2; list2 = list2.next; } current = current.next; } if (list1 != null) { current.next = list1; } if (list2 != null) { current.next = list2; } return newHead; } public static void main(String[] args) { // 创建第一个有序链表 Node list1 = new Node(1); list1.next = new Node(3); list1.next.next = new Node(5); // 创建第二个有序链表 Node list2 = new Node(2); list2.next = new Node(4); list2.next.next = new Node(6); // 合并链表 Node mergedList = mergeLinkedLists(list1, list2); // 打印合并后链表的值 Node current = mergedList; while (current != null) { System.out.print(current.value + " "); current = current.next; } } } ``` 运行上述代码,将输出合并后链表的值:1 2 3 4 5 6。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值