首页 > 其他分享 >合并有序链表

合并有序链表

时间:2023-11-19 11:22:06浏览次数:23  
标签:p2 p1 合并 list value next 链表 有序 L1

一、题目

二、代码

1. 思想:将情况分为三种,大于和小于简单的合并,相等的时候需要额外考虑一些问题

哪些问题?

1.新表指针如何移动 2.两个子表指针如何移动
相等的时候,需要考虑新表指针的如何操作,

当新表中已经存在,两个子表指针目前所指节点的值,就只需将两个子表中重复的元素略过,

否则,则需要将这个值加入到新表,再将重复的元素略过。

2. 我的解答

#include<stdio.h>
#include<malloc.h>

typedef struct linkList {
	int value;
	struct linkList* next;
}list;

void insert_tail(list* L,int data) {
	if (L) {
		list* p = L;
		while (p->next) 
			p = p->next;
		list* newNode = (list*)malloc(sizeof(list));
		newNode->value = data;
		newNode->next = p->next;
		p->next = newNode;
	}
}

list* init(list* L,int n) {
	L = (list*)malloc(sizeof(list));
	L->next = NULL;
	int temp;
	for (int i = 0; i < n; i++) {
		scanf("%d", &temp);
		insert_tail(L, temp);
	}
	return L;
}

void print(list* L) {
	if (!L) return;
	list* p = L->next;
	while (p) {
		printf("%d ", p->value);
		p = p->next;
	}
	printf("\n");
}

list* merge(list* L1, list* L2) {
	if (!L1 || !L2) return L1 ? L1 : L2;
	list* p1 = L1->next, * p2 = L2->next, * p3 = L1;//L1子表指针p1 L2子表指针p2 L3新表指针p3
	while (p1 && p2) {
		if (p1->value == p2->value) {
			int temp = p1->value;
			if (p3 == L1 || p3->value != temp) {
				p3->next = p1;
				p1 = p1->next;
			}
			while (p1 && p1->value == temp)
				p1 = p1->next;
			while (p2 && p2->value == temp) 
					p2 = p2->next;		
		}
		else if (p1->value < p2->value) {
			p3->next = p1;
			p1 = p1->next;
		}
		else {
			p3->next = p2;
			p2 = p2->next;
		}
		p3 = p3->next;
	}
	p3->next = p1 ? p1 : p2;
	free(L2);
	return L1;
}

int main() {
	list* L1 = NULL;
	L1 = init(L1, 5);
	list* L2 = NULL;
	L2 = init(L2, 5);
	//合并
	list* L3 = merge(L1, L2);
	print(L3);
	return 0;
}

标签:p2,p1,合并,list,value,next,链表,有序,L1
From: https://www.cnblogs.com/cony1/p/17841757.html

相关文章

  • cf1899G. Unusual Entertainment(启发式合并)
    https://codeforces.com/contest/1899/problem/G首先将将节点重新映射一下然后就是个启发式合并板题#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<map>#include<vector>#include<set>#include<queue>#in......
  • 两两交换链表中的节点
    现在时间是:  2023年11月18日 星期六   农历十月初六  22:08:每天坚持刷Leetcode,遇到有些突然看到就不能想得很清楚的题目,还是需要进行记录一下!Leetcode热题100(学习计划):两两交换链表中的节点,题目信息如下:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节......
  • 206. 反转链表 (精选)
    2023-11-18206.反转链表-力扣(LeetCode)思路:注意leetcode是没有头节点的,只有数据节点1先将指针放到最后,然后从开头取节点,放到此节点后面遍历2遍,不好2引入头节点,头插法可以就用本来的链表/定义一个新的链表3原地反转链表的线迭代(双指针)递归相当于1的思路1简单,就......
  • 数组类算法题——删除有序数组中的重复项
    删除有序数组中的重复项题目:给你一个非严格递增排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。考虑nums的唯一元素的数量为k,你需要做以下事情确保你的......
  • 【HDU 1276】士兵队列训练问题 题解(链表+模拟)
    某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至......
  • (链表)16-删除有序链表中重复的元素-b
    1importjava.util.*;23/*4*publicclassListNode{5*intval;6*ListNodenext=null;7*publicListNode(intval){8*this.val=val;9*}10*}11*/12publicclassSolution{13/**14*@paramhead......
  • (链表)10-相交链表
    1/*2publicclassListNode{3intval;4ListNodenext=null;56ListNode(intval){7this.val=val;8}9}*/10publicclassSolution{11publicListNodeFindFirstCommonNode(ListNodepHead1,ListNodepHead2)......
  • (链表)15-删除有序链表中的重复元素-a
    1importjava.util.*;23/*4*publicclassListNode{5*intval;6*ListNodenext=null;7*publicListNode(intval){8*this.val=val;9*}10*}11*/12publicclassSolution{13/**14*@paramhead......
  • Git合并时一些鲜为人知的坑
    1. 反复解决同一个冲突最常见的原因:  多人团队中开启了rebase,对commit顺序造成破坏,使得merge其他分支时可能找不到原始commitid的关联信息,就需要重新merge conflicts.  2.明明合并完了,又让从头合并当然这和用rebase有关的,关键是已经解决了冲突,为啥还让从头再来......
  • MRI roi图像合并
    笔记来源:MRIroi的图像合并dpabi小工具_哔哩哔哩_bilibili1.如果几个图像的维度不一致,需要先进行reslice1)如何看图像的维度以软件MRIcron为例,window→information,如红框所示,如果几幅图像的维度不一致,则需要进行重采样,length[969672]是图像采集了72层,每一层的分辨率是96*9......