【C语言】20_链表的常见面试题,求中间结点 & 判断是否有环 & 反转 & 合并两条有序链表

typedef struct Node {
	int data;
	struct Node* next;
} Node;

//求链表中间结点的值
Node* middleElement(Node* list) {
	Node* slow = list, * fast = list;
	while (fast && fast->next) {
		slow = slow->next;
		fast = fast->next->next;
	}
	return slow;
}

//判断单链表是否有环
bool hasCircle(Node* list) {
	if (!list || !list->next) {
		return false;
	}

	Node* slow = list;
	Node* fast = list->next;

	while (fast && fast->next) {
		if (slow == fast) { 
			return true;
		}
		slow = slow->next;
		fast = fast->next->next;
	}
 
	return false;
}

//反转单链表
Node* reverse(Node* list) {
	//递归
	if (!list || !list->next) return list;
	Node* tail = reverse(list->next);
	list->next->next = list;
	list->next = NULL;
	return tail;
	
	//循环
	//if (!list || !list->next) return list;
	//Node* cur = NULL, * tmp = list, * tail = list;
	//while (tmp) {
	//	tail = tail->next;
	//	tmp->next = cur;
	//	cur = tmp;
	//	tmp = tail;
	//}
	//return cur;
}

//合并两条有序的单向链表,使得合并后的链表也是有序的 
//(要求: 不能额外申请堆内存空间)
Node* mergeTwoLists(Node* list1, Node* list2) {
	//递归
	if (!list1) return list2;
	if (!list2) return list1;
	if (list1->data < list2->data) {
		list1->next = mergeTwoLists(list1->next, list2);
		return list1;
	} else {
		list2->next = mergeTwoLists(list1, list2->next);
		return list2;
	}

	//循环
	//Node mNode = { -1, NULL };
	//Node* mList = &mNode;
	//while (list1 && list2) {
	//	if (list1->data < list2->data) {
	//		mList->next = list1;
	//		list1 = list1->next;
	//	} else {
	//		mList->next = list2;
	//		list2 = list2->next;
	//	}
	//	mList = mList->next;
	//}
	//mList->next = (!list1) ? list2 : list1;
	//return mNode.next;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值